home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
—‹Œêsrc.lzh
/
meta.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-01-13
|
22KB
|
1,151 lines
#include "3DDEF.H"
#include "GLOBAL.H"
#include "FORWARD.H"
#include "XCODE.H"
extern COMMAND_UNIT command_table[MAX_COMMAND_NUMBER];
extern UBYTE search_w1[VERY_LONG_LINE * 40];
/* マークへのジャンプ */
void
meta_ctrl_g()
{
UNIT *wp;
int bp;
int y;
int a;
if ((a = etc_get_arg()) >= MAX_MARK) {
under_print((STR)"マーク番号が不適当です");
return;
}
line_seigyou();
if (wp = mark_get_mark(a,&bp)) {
CL = wp;
line_cl_cl();
if ((y = window_is_this_line_in_current(CL)) < 0) { /* 入ってない */
disp_cl_center();
} else {
CY = y;
}
work_line_analyze();
CPX = work_byte_to_CPX(bp);
CX0 = CX = ANALYZE[CPX].XPOS;
under_blanc();
work_cursor_cpx();
} else {
UBYTE w[MAXLINE];
sprintf((char *) w,"マーク %1d は設定されていません",a);
under_print(w);
}
}
/* 左1ワード削除 */
void
meta_ctrl_h()
{
meta_d_sub(meta_b);
}
/* ウインドウの書き直し */
void
meta_ctrl_l()
{
int a;
line_seigyou();
a = etc_get_arg();
if (!a) {
disp_cl_center();
} else if ((a-1) > (CWY1-CWY0)) {
disp_cl_y(CWY1);
} else {
disp_cl_y(a-1);
}
work_cursor_cpx();
}
/* 確認置換 */
void
meta_ctrl_r()
{
meta_replace(0);
}
void
meta_replace(int go_flag)
{
UBYTE w[VERY_LONG_LINE * 4];
UNIT *pp0,*pp,*p1,*p2;
UNIT *lp1,*lp2;
int bb0,bb,b1,b2;
int count = 0;
UINT c;
int xflag,flag,uflag;
int give_up;
lp1 = NULL; /* 初期化 */
/* go_flag = 確認せずに置換を強行 */
/* xflag = 置換を続行 */
/* flag = 次の置換に行ってはいけない */
etc_string_esc_cnv(STRING_ESC1,STRING_ESC1_s);
if (go_flag) {
sprintf((char *) w,"置換 [%s]<META>",STRING_ESC1_s);
} else {
sprintf((char *) w,"確認置換 [%s]<META>",STRING_ESC1_s);
}
if (under_input_esc(w,STRING_ESC1) < 0) { /* 無効であった = ^G */
under_print((STR)"[中断]");
return;
}
if (!*STRING_ESC1) { /* 置換元が無い */
under_blanc();
return;
}
etc_string_esc_cnv(STRING_ESC1,STRING_ESC1_s);
etc_string_esc_cnv(STRING_ESC2,STRING_ESC2_s);
sprintf((char *) w,"with [%s]<META>",STRING_ESC2_s);
if (under_input_esc(w,STRING_ESC2) < 0) { /* 無効であった = ^G */
under_print((STR)"[中断]");
return;
}
etc_string_esc_cnv(STRING_ESC2,STRING_ESC2_s);
/* 確認置換実行 */
line_seigyou(); /* 整行する */
pp0 = pp = CL;
bb0 = bb = ANALYZE[CPX].BPOS;
xflag = 1;
uflag = 0;
strcpy(STRING_ESC1_u,STRING_ESC1);
etc_jstrup(STRING_ESC1_u);
while(xflag) {
if (!uflag) {
give_up = ctrl_s_get_string(pp,bb,STRING_ESC1_u,&p1,&b1,&p2,&b2);
if (!give_up) {
break;
}
} else { /* ??? */
uflag = 0;
give_up = ctrl_s_get_string(pp,bb,STRING_ESC1_u,&p1,&b1,&p2,&b2);
if (!give_up) {
break;
}
}
if (give_up < 0) { /* 中断だ */
goto replace_stop;
}
jump(p1,b1);
/* 置換元に属性が前置している可能性がある */
b1 = line_remove_attribute(b1);
/* 前置している属性までさかのぼる */
if (!go_flag) { /* 確認モードである */
sprintf((char *)w,"置換 '%s' with '%s'?",STRING_ESC1_s,STRING_ESC2_s);
under_print(w);
}
if (CPX && (line_cl_1byte(CPX-1) == CR)) {
/* 左が改行 */
if (CL->ATO == TAIL) {
ctrl_b();
} else {
ctrl_f();
}
}
work_cursor_cpx();
flag = 1;
while(flag) {
int lb1,lb2;
UBYTE code;
if (((code = fep_get_key()) == '['-'@') || (code == 'G'-'@')) {
etc_beep();
goto replace_stop;
}
if (go_flag) {
c = 'Y'; /* ううう、CL は最後にいじるだけにすべき! */
} else {
c = toupper(fep_inkey_raw());
}
switch(c) {
case '!': /* 最後まで強行 */
go_flag = 1;
case 'Y':
case ' ':
line_seigyou();/* ,,, */
work_replace_str_echo_xxx(p1,b1,p2,b2,STRING_ESC2);
lp1 = p1;
lb1 = b1;
line_seigyou();
/* BAG が発生する可能性有り */
ctrl_s_trace_real_byte(p1,b1,strlen(STRING_ESC2),&pp,&bb);
/*printf("[%x:%d,%x:%d]",p1,b1,pp,bb);binkey();*/
lp2 = pp;
lb2 = bb;
jump(pp,bb);
count++;
flag = 0;
change_check();
break;
case 'N':
pp = p2;
bb = b2;
flag = 0;
break;
case 'U': /* 1個だけチャイして続行 */
if (lp1) {
work_replace_str_echo_xxx(lp1,lb1,lp2,lb2,STRING_ESC1);
line_seigyou();
/* BAG が発生する可能性有り */
count--;
change_check();
pp = lp1;
bb = lb1;
lp1 = NULL;
flag = 0;
uflag = 1;
} else {
etc_beep();
work_cursor_cpx();
}
break;
case '.':
pp = pp0;
bb = bb0;
flag = 0;
xflag = 0;
break;
/* jump(pp0,bb0);*/
case 'G'-'@': /* その場で中断 */
case '['-'@':
replace_stop:
flag = 0;
xflag = 0;
pp = CL;
bb = ANALYZE[CPX].BPOS;
break;
default: /* beep 音を出してヘルプ */
etc_beep();
case '?': /* ヘルプ */
under_print((STR)"(Y or SPACE)置換 (N)無視 (!)強行 (U)キャンセル (^G)中断 (.)戻る (?)ヘルプ:");
continue;
}
}
}
jump(pp,bb);
if (CPX && (line_cl_1byte(CPX-1) == CR)) {
/* 左が改行 */
ctrl_b();
}
sprintf((char *)w,"%d 箇所 置換しました",count);
under_print(w);
}
void
jump(UNIT *p1,int b1)
{
int y;
CL = p1;
line_cl_cl();
if ((y = window_is_this_line_in_current(CL)) < 0) { /* 入ってない */
disp_cl_center();
} else {
CY = y;
}
work_line_analyze();
CPX = work_byte_to_CPX(b1);
CX0 = CX = ANALYZE[CPX].XPOS;
}
/* 次ウインドウ次頁 */
void
meta_ctrl_v()
{
ctrl_x_o(); /* 次ページへ */
ctrl_v();
ctrl_x_p(); /* 戻る */
}
/* 次ウインドウ前頁 */
void
meta_ctrl_z()
{
ctrl_x_o(); /* 次ページへ */
ctrl_z();
ctrl_x_p(); /* 戻る */
}
/* マークセット */
void
meta_space()
{
int a;
if ((a = etc_get_arg()) <= MAX_MARK) {
UBYTE w[MAXLINE];
mark_set_mark(a);
sprintf((char *) w,"[マーク %1d 設定]",a);
under_print(w);
} else {
under_print((STR)"マーク番号が不適当です");
}
}
void
meta_arg0()
{
meta_argn(0);
}
void
meta_arg1()
{
meta_argn(1);
}
void
meta_arg2()
{
meta_argn(2);
}
void
meta_arg3()
{
meta_argn(3);
}
void
meta_arg4()
{
meta_argn(4);
}
void
meta_arg5()
{
meta_argn(5);
}
void
meta_arg6()
{
meta_argn(6);
}
void
meta_arg7()
{
meta_argn(7);
}
void
meta_arg8()
{
meta_argn(8);
}
void
meta_arg9()
{
meta_argn(9);
}
void
meta_argn(int b)
{
UINT k;
int w = 0,w0;
etc_set_arg(b);
disp_cursor_on(); /* カーソルを出す */
disp_show_cursor(); /* カーソルのブリンクを強制的にオンにする */
fep_key_clear(); /* キーバッファのクリア */
k = fep_inkey_raw();
while(('0' <= k) && (k <= '9')) { /* 数字であり続ける限り */
w0 = w;
etc_set_arg(w = etc_get_arg() *10 +(k - '0'));
if ((w/10) < w0) {
w = 0;
etc_set_arg(0);
k = (UINT) '0';
} else {
k = fep_inkey_raw();
}
}
fep_push_key(k); /* 戻す */
}
#if 0
typedef struct COMMAND_UNIT {
UBYTE COMMAND_STRING[MAX_COMMAND_STROKE+1]; /* */
UINT COMMAND_FLAG; /* 実行後の処理のフラグ */
void (*FUNCTION)(); /* */
UBYTE COMMAND_NAME[MAX_COMMAND_NAME_LENGTH+1]; /* */
} COMMAND_UNIT;
#endif
/* キーバインド一覧 */
void
meta_a()
{
int i,n;
UWORD *s;
UWORD c;
int f,t,wn;
UBYTE filename[MAXLINE];
UBYTE w[MAXLINE];
UBYTE wlist[MAX_WINDOW]; /* フラグ用 */
UNIT *p;
line_seigyou();
if ((f = file_search((STR)"[KeyDEF]")) >= 0) { /* 既にある */
UBYTE list[MAX_WINDOW];
t = etc_text_search(f);
/* list の中にフラグをセットして返す */
/* 指定のテキスト番号を扱っているウインドウ番号を返す */
if (window_which_has_text_number(t,list)) {
/* ウインドウが存在する */
for(i=0;i<MAX_WINDOW;i++) {
if (list[i]) { /* 最初のウインドウで抜ける */
window_change(i);
break;
}
}
} else { /* ウインドウが存在しない */
if ((wn = ctrl_x_20()) < 0) { /* 新しく作られたウインドウ */
/* できなかった */
return;
}
window_change(wn);
ctrl_x_ctrl_f1_alway((STR)"[KeyDEF]");
}
} else {
if (window_get_free_text_number() < 0) { /* 開いたテキストがない */
etc_inp_y((STR)"扱うテキストの数が多すぎます。中断します [Y]?");
return;
}
if ((wn = ctrl_x_20()) < 0) { /* 新しく作られたウインドウ */
/* できなかった */
return;
}
window_change(wn); /* カレントを移動する */
}
/* wn にバッファリストを表示する */
if (strcmp(FILE_NAMES_ST[WDATA[CWN].WTEXTS].CONTENT,"[KeyDEF]")) {
ctrl_x_ctrl_f0((STR)"[KeyDEF]");
} else if (HEAD->ATO != TAIL) {
line_deleten_echo(HEAD,TAIL);
buff_read_file_new();
}
ctrl_x_f0(COLUMN_MAX);
CL= HEAD->ATO;
line_store_and_echo(CL,(STR)"キー定義\n");
line_cl_cl();
CX = CX0 = CPX = 0;
for(n = 0;n < MAX_COMMAND_NUMBER;n++) {
s = command_table[n].COMMAND_STRING; /* ストローク */
if (!*s) { /* 割り当てがない */
continue;
}
i = 0;
while(c = *s++) {
if (i) {
w[i++] = '-';
}
if (c < 0x20) {
if (c == '\x1b') {
meta_a_sub(w,&i,"ESC");
} else if (c == 'M' - '@') {
meta_a_sub(w,&i,"<NL>");
} else {
w[i++] = '^';
w[i++] = c + '@';
}
} else if (c > 0x100) { /* XF など */
switch(c) {
case FEP_HELP_CODE:
meta_a_sub(w,&i,"HELP");
break;
case (FEP_HELP_CODE | 0x20):
meta_a_sub(w,&i,"CTRL+HELP");
break;
case FEP_DEL_CODE:
meta_a_sub(w,&i,"DEL");
break;
case FEP_HOME_CODE:
meta_a_sub(w,&i,"HOME");
break;
case FEP_CLR_CODE:
meta_a_sub(w,&i,"CLR");
break;
case FEP_UNDO_CODE:
meta_a_sub(w,&i,"UNDO");
break;
case FEP_ROLLDN_CODE:
meta_a_sub(w,&i,"ROLL UP");
break;
case FEP_ROLLUP_CODE:
meta_a_sub(w,&i,"ROLL DOWN");
break;
defailt:
break;
}
break;
} else {
if (c == ' ') {
meta_a_sub(w,&i,"<SP>");
} else {
w[i++] = c;
}
}
}
if (i) {
do {
w[i++] = ' ';
} while(i < 16); /* 適当 */
strcpy(&w[i],command_table[n].COMMAND_NAME);
strcat(w,"\n");
p = line_get_free_and_store_ck(w);
line_append1_echo(p);
}
}
ctrl_l();
}
void
meta_a_sub(STR w,int *i,STR s)
{
register int l;
l = strlen(s);
strncpy(&w[*i],s,l);
(*i) += l;
}
/* @@@@@@AAAAAABBBBBBBCCCCCC */
/* ^ ^
/* ^ ^
/* 1ワード左へ */
void
meta_b()
{
if (meta_b_sub() >= 0) { /* 前のワードを1つ追い越している */
ctrl_f(); /* 戻す */
}
if (!etc_group(line_cpx_code())) { /* おっと、記号だぜ */
if (meta_b_sub() >= 0) { /* 前のワードを1つ追い越している */
ctrl_f(); /* 戻す */
}
}
}
/* 1ワード右へ */
void
meta_f()
{
int g;
if ((g = meta_f_sub()) >= 0) { /* 終端ではない */
if (!g) { /* おっと、記号だぜ */
meta_f_sub();
}
}
}
/* アルファベットを通り過ぎるまで行く */
void
meta_f_alpha_end()
{
register UINT c;
register int g,g0,flag;
g0 = etc_group(line_cpx_code());
flag = (g0 == 1);
while(1) {
if ((((c = line_cpx_code()) == EOS) || (c == CR)) && (CL->ATO == TAIL)) {
return; /* 終端である */
}
ctrl_f();
if (!(c = line_cpx_code())) { /* 行末である */
ctrl_f();
c = line_cpx_code();
}
if ((g = etc_group(c)) == 1) {
g0 = flag = 1;
continue;
} else if ((g0 > 0) && (!g)) {
return;
} else {
g0 = g;
}
if (flag) {
return;
}
}
}
int
meta_f_sub()
{
UINT c;
int g,g0;
g0 = etc_group(line_cpx_code());
while(1) {
if ((((c = line_cpx_code()) == EOS) || (c == CR)) && (CL->ATO == TAIL)) {
return(-1); /* 終端である */
}
ctrl_f();
if (!(c = line_cpx_code())) { /* 行末である */
ctrl_f();
c = line_cpx_code();
}
g = etc_group(c);
if (g != g0) {
return(g);
}
}
}
int
meta_b_sub()
{
UINT c;
int count = 0;
int g,g0;
g0 = etc_group(line_cpx_code());
while(1) {
if (!CPX && (CL == HEAD->ATO)) {
return(-1); /* 先頭である */
}
ctrl_b();
if (!(c = line_cpx_code())) {
ctrl_b();
c = line_cpx_code();
}
g = etc_group(c);
if (g != g0) {
if (count) {
return(g);
} else {
g0 = g;
}
}
count++;
}
}
int
meta_b_sub_ed()
{
UINT c;
int count = 0;
int g,g0;
g0 = etc_group(line_cpx_code());
while(1) {
if (!CPX && (CL == HEAD->ATO)) {
return(-1); /* 先頭である */
}
ctrl_b();
if (!(c = line_cpx_code())) {
ctrl_b();
c = line_cpx_code();
}
if (c == CR) {
return(-1);
}
g = etc_group(c);
if (g != g0) {
if (count) {
return(g);
} else {
g0 = g;
}
}
count++;
}
}
/* 次の一語を削除 */
/* ^W の変形だな */
void
meta_d()
{
meta_d_sub(meta_f);
}
/* 現在位置と、function を実行したあとで削除を実行する */
void
meta_d_sub(void (*function)())
{
UNIT *wp;
int bp,a;
if (commander_is_last_cut_buff_type()) {
} else { /* でなければ、カットバッファをクリア */
buff_clear_cut_buff();
}
line_seigyou();
mark_set_mark(a = XCODE_SYSMARK - XCODE_MARK + CWN); /* 現在位置にマークする */
(*function)();
wp = mark_get_mark(a,&bp); /* マークを得る */
if ((wp != CL) || (bp != ANALYZE[CPX].BPOS)) { /* 移動した */
change_check();
work_delete_to_cut_buff(CL,ANALYZE[CPX].BPOS,wp,bp);
mark_erase_mark(XCODE_SYSMARK - XCODE_MARK + CWN); /* システムマークを消す */
work_cursor_cpx();
}
}
/* 指定行へジャンプ */
void
meta_g()
{
int a;
if (!(a = etc_get_arg())) { /* 行番号の事前指定が無かった */
/* 行番号を入力する */
UBYTE w[MAXLINE];
under_input_cr_raw((STR)"行番号: ",w);
a = atoi((char *)w);
}
meta_g0(a);
}
/* 指定行へジャンプ */
void
meta_g0(int a)
{
if (a > 0) { /* ジャンプ */
int y;
register int lc=0;
register UNIT *p;
line_seigyou();
p = HEAD->ATO;
while(p != TAIL) {
if (++lc == a) {
CL = p;
break;
}
p = p->ATO;
}
if (p == TAIL) {
CL = TAIL->MAE;
}
line_cl_cl();
if ((y = window_is_this_line_in_current(CL)) < 0) { /* 入ってない */
disp_cl_center();
} else {
CY = y;
}
work_line_analyze();
CPX = CX0 = CX = 0;
under_blanc();
work_cursor_cpx();
}
}
/* 無条件置換 */
void
meta_r()
{
meta_replace(1);
}
/* 指定範囲をバッファに取り込む */
void
meta_w()
{
UNIT *wp;
int bp;
int y;
int a;
if (commander_is_last_cut_buff_type()) {
} else { /* でなければ、カットバッファをクリア */
buff_clear_cut_buff();
}
if ((a = etc_get_arg()) >= MAX_MARK) {
under_print((STR)"マーク番号が不適当です");
return;
}
line_seigyou();
if (wp = mark_get_mark(a,&bp)) {
work_copy_to_cut_buff(wp,bp,CL,ANALYZE[CPX].BPOS);
under_print((STR)"[コピー]");
work_cursor_cpx();
} else {
UBYTE w[MAXLINE];
sprintf((char *) w,"マーク %1d は設定されていません",a);
under_print(w);
}
}
void
meta_left_blaket()
{
int y;
CL = HEAD->ATO;
line_cl_cl();
if ((y = window_is_this_line_in_current(CL)) < 0) { /* 入ってない */
line_seigyou();
disp_cl_center();
} else {
CY = y;
}
work_line_analyze();
CX0 = CPX = 0;
under_blanc();
work_cursor_cpx();
}
void
meta_right_blaket()
{
int y;
CL = TAIL->MAE;
line_cl_cl();
if ((y = window_is_this_line_in_current(CL)) < 0) { /* 入ってない */
line_seigyou();
disp_cl_center();
} else {
CY = y;
}
work_line_analyze();
ctrl_e();
under_blanc();
work_cursor_cpx();
}
void
meta_upper_bar()
{
if (CURRENT_CHANGED) {
CURRENT_CHANGED = 0;
disp_btm_changed_erase_x(CURRENT_TEXT);
} else {
under_blanc();
}
}
void
meta_l()
{
meta_lu(etc_tolower);
}
void
meta_u()
{
meta_lu(etc_toupper);
}
void
meta_lu(UINT (*func)())
{
UNIT *lp;
int lbp;
lp = CL;
lbp = ANALYZE[CPX].BPOS;
meta_f_alpha_end();
ctrl_x_ctrl_lu_sub(lp,lbp,CL,ANALYZE[CPX].BPOS,func);
}
void
meta_v()
{
ctrl_z();
}
/* すべてのファイルをセーブしてから終了 */
void
meta_z()
{
register int t;
for(t=0;t<MAX_TEXT;t++) {
if ((TDATA[t].TEXT_FILE != -1) && (1)) { /* 次のが見つかった */
window_set_text(CWN,t);
window_set_current(CWN);
if (*FILE_NAMES_ST[WDATA[CWN].WTEXTS].CONTENT != '[') {
ctrl_x_ctrl_s();
}
}
}
ctrl_x_ctrl_c();
}
void
meta_gyo()
{
meta_ctrl_l();
}
/* 最初の1文字だけ大文字に */
void
meta_c()
{
UNIT *lp;
int lbp;
lp = CL;
lbp = ANALYZE[CPX].BPOS;
meta_f_alpha_end();
meta_c_sub(lp,lbp,CL,ANALYZE[CPX].BPOS);
}
void
meta_c_sub(UNIT *lp,int lbp,UNIT *rp,int rbp)
{
UNIT *wp;
register int wb,nb;
int x0=0;
UBYTE w[VERY_LONG_LINE*4];
register STR pp;
register UINT c,c0;
register int flag;
/* etc_line_order(&lp,&lbp,&rp,&rbp);*/
line_get_body(w,wp = lp);
wb = lbp;
flag = 0;
while((wp != rp) || (wb < rbp)) {
pp =line_skip_xcode(&w[wb]);
if (c0 = (*pp)) { /* 行末ではない */
if (flag) { /* 既に先頭を処理した */
if (iskanji(c0)) {
c0 = (c0 << 8) | (UBYTE)pp[1];
c = etc_tolower(c0);
if (c != c0) {
*pp = (c >> 8) & 0xff;
pp[1] = c & 0xff;
flag = 1;
}
} else {
c = etc_tolower(c0);
if (c != c0) {
*pp = c;
flag = 1;
}
}
} else {
if (iskanji(c0)) {
c0 = (c0 << 8) | (UBYTE)pp[1];
c = etc_toupper(c0);
if (c != c0) {
*pp = (c >> 8) & 0xff;
pp[1] = c & 0xff;
flag = 1;
}
} else {
c = etc_toupper(c0);
if (c != c0) {
*pp = c;
flag = 1;
}
}
if (!flag && (etc_tolower(c0) != c0)) { /* low にできるコードである */
flag = 2;
}
}
}
nb = line_touch_next_char_x(w,wb,&x0);
if (nb == wb) {
line_store_and_echo(wp,w); /* 納める */
line_get_body(w,wp = wp->ATO); /* 次の行へ */
flag = wb = 0; /* 行頭から */
} else {
wb = nb; /* 次の文字へ */
}
}
if (flag == 1) {
line_store_and_echo(wp,w); /* 納める */
change_check();
}
line_cl_cl();
work_line_analyze();
}
void
meta_replace_r(int go_flag)
{
UBYTE w[VERY_LONG_LINE * 4];
UNIT *pp0,*pp,*p1,*p2;
UNIT *lp1,*lp2;
int bb0,bb,b1,b2;
int count = 0;
UINT c;
int xflag,flag,uflag;
int give_up;
lp1 = NULL; /* 初期化 */
/* go_flag = 確認せずに置換を強行 */
/* xflag = 置換を続行 */
/* flag = 次の置換に行ってはいけない */
etc_string_esc_cnv(STRING_ESC1,STRING_ESC1_s);
if (go_flag) {
sprintf((char *) w,"逆方向置換 [%s]<META>",STRING_ESC1_s);
} else {
sprintf((char *) w,"逆方向確認置換 [%s]<META>",STRING_ESC1_s);
}
if (under_input_esc(w,STRING_ESC1) < 0) { /* 無効であった = ^G */
under_print((STR)"[中断]");
return;
}
if (!*STRING_ESC1) { /* 置換元が無い */
under_blanc();
return;
}
etc_string_esc_cnv(STRING_ESC1,STRING_ESC1_s);
etc_string_esc_cnv(STRING_ESC2,STRING_ESC2_s);
sprintf((char *) w,"with [%s]<META>",STRING_ESC2_s);
if (under_input_esc(w,STRING_ESC2) < 0) { /* 無効であった = ^G */
under_print((STR)"[中断]");
return;
}
etc_string_esc_cnv(STRING_ESC2,STRING_ESC2_s);
/* 確認置換実行 */
line_seigyou(); /* 整行する */
pp0 = pp = CL;
bb0 = bb = ANALYZE[CPX].BPOS;
xflag = 1;
uflag = 0;
strcpy(STRING_ESC1_u,STRING_ESC1);
etc_jstrup(STRING_ESC1_u);
while(xflag) {
if (!uflag) {
give_up = ctrl_r_get_string(pp,bb,STRING_ESC1_u,&p1,&b1,&p2,&b2);
if (!give_up) {
break;
}
} else { /* ??? */
uflag = 0;
give_up = ctrl_r_get_string(pp,bb,STRING_ESC1_u,&p1,&b1,&p2,&b2);
if (!give_up) {
break;
}
}
if (give_up < 0) {
goto replace_give_up;
}
jump(p1,b1);
/* 置換元に属性が前置している可能性がある */
b1 = line_remove_attribute(b1);
/* 前置している属性までさかのぼる */
if (!go_flag) { /* 確認モードである */
sprintf((char *)w,"置換 '%s' with '%s'?",STRING_ESC1_s,STRING_ESC2_s);
under_print(w);
}
if (CPX && (line_cl_1byte(CPX-1) == CR)) {
/* 左が改行 */
if (CL->ATO == TAIL) {
ctrl_b();
} else {
ctrl_f();
}
}
work_cursor_cpx();
flag = 1;
while(flag) {
int lb1,lb2;
if (go_flag) {
c = 'Y'; /* ううう、CL は最後にいじるだけにすべき! */
} else {
c = toupper(fep_inkey_raw());
}
switch(c) {
case '!': /* 最後まで強行 */
go_flag = 1;
case 'Y':
case ' ':
line_seigyou();
work_replace_str_echo_xxx(p1,b1,p2,b2,STRING_ESC2);
lp1 = p1;
lb1 = b1;
line_seigyou();
/* BAG が発生する可能性有り */
ctrl_r_trace_real_byte(p1,b1,strlen(STRING_ESC2),&pp,&bb);
/*printf("[%x:%d,%x:%d]",p1,b1,pp,bb);binkey();*/
lp2 = pp;
lb2 = bb;
count++;
flag = 0;
change_check();
break;
case 'N':
pp = p2;
bb = b2;
flag = 0;
break;
case 'U': /* 1個だけチャイして続行 */
if (lp1) {
work_replace_str_echo_xxx(lp1,lb1,lp2,lb2,STRING_ESC1);
line_seigyou();
/* BAG が発生する可能性有り */
count--;
change_check();
pp = lp1;
bb = lb1;
lp1 = NULL;
flag = 0;
uflag = 1;
} else {
etc_beep();
work_cursor_cpx();
}
break;
case '.':
pp = pp0;
bb = bb0;
flag = 0;
xflag = 0;
/* jump(pp0,bb0);*/
case 'G'-'@': /* その場で中断 */
replace_give_up:
flag = 0;
xflag = 0;
pp = CL;
bb = ANALYZE[CPX].BPOS;
break;
default: /* beep 音を出してヘルプ */
etc_beep();
case '?': /* ヘルプ */
under_print((STR)"(Y or SPACE)置換 (N)無視 (!)強行 (U)キャンセル (^G)中断 (.)戻る (?)ヘルプ:");
continue;
}
}
}
jump(pp,bb);
if (CPX && (line_cl_1byte(CPX-1) == CR)) {
/* 左が改行 */
ctrl_b();
}
sprintf((char *)w,"%d 箇所 置換しました",count);
under_print(w);
}